//behavior.h
#ifndef BEHAVIOR_H
#define BEHAVIOR_H

//小车的基本行为

#ifndef DEG_TO_RAD
#define DEG_TO_RAD (M_PI / 180.0f)
#endif

#ifndef RAD_TO_DEG
#define RAD_TO_DEG (180.0f / M_PI)
#endif

// 可选：定义一个函数式宏，语义更清晰
#define ANGLE_DEG(deg)    ((deg) * DEG_TO_RAD)
#define ANGLE_RAD(rad)    (rad)  // 仅语义标记

//统一接口：
int behavior_update(void);  // 返回 0=进行中，1=完成
/*
** 内部管理状态：
** 使用 static 变量保存“是否已初始化”
** 不依赖全局状态机枚举
** 每次调用检查当前状态，决定下一步
*/
// ========================
// 函数声明
// ========================

/**
 * @brief 初始化行为控制模块（如PID控制器）
 */
void behavior_init(void);

/**
 * @brief 前进指定距离
 * @param distance 目标距离（米）
 * @param speed 行驶速度（m/s）
 * @return 1 = 完成，0 = 进行中
 */
int drive_straight(float distance, float speed);

/**
 * @brief 转向指定绝对角度（角度制）
 * @param target_angle_deg 目标朝向（角度，-180 ~ 180）
 * @return 1 = 完成，0 = 进行中
 */
int turn_to_angle(float target_angle_deg);

/**
 * @brief 相对旋转指定角度
 * @param degrees 旋转角度（+为逆时针，-为顺时针，单位：度）
 * @param max_angular_speed 最大角速度（角度/s）
 * @return 1 = 完成，0 = 进行中
 */
int turn_by_degree(float degrees, float max_angular_speed);

/**
 * @brief 沿指定半径的圆弧行驶指定角度（纯 PID 控制，仅限最大角速度）
 * @param radius 转弯半径（米），>0 左转（逆时针），<0 右转（顺时针）
 * @param angle_deg 目标转过的角度（度），+为逆时针，-为顺时针
 * @param max_angular_speed_deg 最大允许角速度（度/秒）
 * @return 1=完成，0=进行中
 *
 * @note 线速度由 v = ω * |radius| 自动决定，不单独设置
 */
int drive_arc_by_angle_pid(float radius, float angle_deg, float max_angular_speed_deg);

/**
 * @brief 沿圆弧行驶指定角度
 * @param radius 转弯半径（米），>0 左转，<0 右转
 * @param angle_deg 转弯角度（度），+为逆时针
 * @param speed 线速度（m/s）
 * @return 1 = 完成，0 = 进行中
 */
int drive_arc_by_angle(float radius, float angle_deg, float speed);

/**
 * @brief 沿圆弧行驶（按弧长或持续运行）
 * @param radius 转弯半径（米），>0 左转，<0 右转
 * @param distance 弧长（米），<0 表示持续运行
 * @param speed 线速度（m/s）
 * @return 1 = 完成，0 = 进行中
 */
int drive_arc(float radius, float distance, float speed);

/**
 * @brief 原地旋转（持续行为，需手动停止）
 * @param angular_speed 角速度（rad/s，+为逆时针）
 * @return 0 = 持续中（永不完成），1 = 可扩展为完成（如转n圈）
 */
int rotate_in_place(float angular_speed);

/**
 * @brief 平滑减速停止
 * @return 1 = 已停止，0 = 正在减速
 */
int stop_smoothly(void);

/**
 * @brief 保持当前位置（当前实现为停止）
 * @return 0 = 持续保持（永不自动完成）
 */
int hold_position(void);

#endif
